var convert = function (s, numRows) {
  if (numRows === 1) return s

  let len = Math.min(s.length, numRows)
  let num = new Array(numRows).fill('')

  let index = 0
  let down = false
  for (let c of s) {
    num[index] += c
    if (index === 0 || index === numRows - 1) {
      down = !down
    }

    index += down ? 1 : -1
  }

  return num.join('')
}

var convert = function (s, numRows) {
  // 处理特殊情况：当行数为 1 时，直接返回原字符串
  if (numRows === 1) return s

  // 确定实际需要的行数，取字符串长度和指定行数中的较小值
  let len = Math.min(s.length, numRows)
  // 创建一个数组，每个元素代表一行，初始化为空字符串
  let num = new Array(numRows).fill('')

  // 当前处理的行索引
  let index = 0
  // 方向标志：true 表示向下移动，false 表示向上移动
  let down = false

  // 遍历字符串中的每个字符
  for (let c of s) {
    // 将当前字符添加到对应行的字符串中
    num[index] += c

    // 当到达第一行或最后一行时，改变移动方向
    if (index === 0 || index === numRows - 1) {
      down = !down
    }

    // 根据方向更新行索引：向下移动则加 1，向上移动则减 1
    index += down ? 1 : -1
  }

  // 将所有行的字符串连接起来，得到最终结果
  return num.join('')
}